home *** CD-ROM | disk | FTP | other *** search
/ Giga Games 1 / Giga Games.iso / net / usenet / vmsnet / qix / part04 < prev    next >
Encoding:
Text File  |  1992-02-25  |  14.6 KB  |  443 lines

  1. Newsgroups: vmsnet.sources.games
  2. Path: uunet!caen!sol.ctr.columbia.edu!mary.fordham.edu!areid
  3. From: areid@mary.fordham.edu (Darin Reid)
  4. Subject: Qix.03 -- arcade based game
  5. Organization: Fordham University
  6. Message-ID: <25FEB199218591738@mary.fordham.edu>
  7. News-Software: VAX/VMS VNEWS 1.41    
  8. Sender: news@ctr.columbia.edu (The Daily Lose)
  9. Date: Tue, 25 Feb 1992 22:59:00 GMT
  10.  
  11. -+-+-+-+-+-+-+-+ START OF PART 3 -+-+-+-+-+-+-+-+
  12. X         (( Snake_Head_X+Snake_Move_X = Start_Creat_X ) and ( Snake_Head_Y+S
  13. Vnake_Move_Y = Start_Creat_Y)) Then`20
  14. X            Search_For_Move;
  15. X   end else
  16. X      Search_For_Move;
  17. X   If ( Snake_Move_X = 0 ) And ( Snake_Move_Y = 0 ) Then  Begin
  18. X      If Not Snake_got_stuck Then Begin
  19. X         If ( Moves_since_stuck > 10 ) and ( Len_snake > 10 ) Then begin
  20. X             Swap_snake_Head_and_Tail
  21. X         end else begin
  22. X            Len_snake_When_stuck := Len_snake;
  23. X            Snake_got_stuck := true;
  24. X         end;
  25. X      end Else
  26. X         If ( Len_Snake < ( Len_Snake_When_stuck - 10 )) and ( Len_snake > 1
  27. V0 ) Then begin
  28. X            Swap_Snake_Head_and_Tail;
  29. X            Moves_since_stuck := 0;
  30. X            Snake_Got_stuck := False;
  31. X         end;
  32. X    end Else`20
  33. X     Snake_got_stuck := False;
  34. X   Moves_Since_stuck := Moves_since_stuck + 1;
  35. X   If  ( Screen`5BSnake_Head_X+Snake_Move_X,Snake_Head_Y+Snake_Move_Y`5D.Wal
  36. Vl = Created ) or`20
  37. X       (( Snake_Head_X+Snake_Move_X = You_X ) And ( Snake_Head_Y+Snake_Move_
  38. VY = You_Y ) )Then begin
  39. X       Died := True;
  40. Xend;`20
  41. X
  42. Xend;
  43. X
  44. XProcedure Remove_tail;
  45. X
  46. XBegin
  47. X   If ( Len_Snake >= Max_Len_Snake ) Or Snake_got_stuck Then Begin
  48. X      If ( Snake_Tail_X <> Snake_Head_X ) or (Snake_Tail_Y <> Snake_Head_Y)
  49. V Then Begin;`20
  50. X         Pos(Snake_Tail_X,Snake_Tail_Y,Blank);
  51. X         Save_ch := Screen`5BSnake_Tail_X,Snake_Tail_Y`5D.Sym;
  52. X         Screen`5BSnake_Tail_X,Snake_Tail_Y`5D.Sym := Blank;
  53. X         Screen`5BSnake_Tail_X,Snake_Tail_Y`5D.wall := Other;
  54. X      end;
  55. X      If Len_Snake <= 1 Then Begin
  56. X         Len_Snake  := 1;
  57. X         Snake_Tail_X := Snake_Head_X;
  58. X         Snake_Tail_Y := Snake_Head_Y;
  59. X      end else begin
  60. X      Case Save_ch  of`20
  61. X         'l' : If Screen`5BSnake_Tail_X,Snake_Tail_Y+1`5D.Sym In `5B'k','j',
  62. V'q'`5D Then`20
  63. X                  Snake_Tail_Y := Snake_Tail_Y + 1
  64. X               Else
  65. X                  Snake_Tail_X := Snake_Tail_X + 1;
  66. X         'k' : If Screen `5BSnake_Tail_X,Snake_Tail_Y-1`5D.Sym In `5B'l','m'
  67. V,'q'`5D Then`20
  68. X                  Snake_Tail_Y := Snake_Tail_Y - 1
  69. X               Else
  70. X                  Snake_Tail_X := Snake_Tail_X +1 ;
  71. X         'm' : If Screen`5BSnake_Tail_X,Snake_Tail_Y+1`5D.Sym In `5B'k','j',
  72. V'q'`5D Then
  73. X                  Snake_Tail_Y := Snake_Tail_Y + 1
  74. X               Else
  75. X                  Snake_Tail_X := Snake_Tail_X - 1 ;
  76. X         'j' : If Screen`5BSnake_Tail_X,Snake_Tail_Y-1`5D.Sym In `5B'm','l',
  77. V'q'`5D Then`20
  78. X                  Snake_Tail_Y := Snake_Tail_Y - 1
  79. X               Else
  80. X                  Snake_Tail_X := Snake_Tail_X - 1;
  81. X         'x' : If Screen`5BSnake_Tail_X-1,Snake_Tail_Y`5D.Sym In `5B'l','k',
  82. V'x'`5D Then`20
  83. X                  Snake_Tail_X := Snake_Tail_X - 1
  84. X               Else
  85. X                  Snake_Tail_X := Snake_Tail_X + 1;
  86. X         'q' : If Screen`5BSnake_Tail_X,Snake_Tail_Y - 1 `5D.Sym In `5B 'l',
  87. V'm','q'`5D Then`20
  88. X                  Snake_Tail_Y := Snake_Tail_Y - 1
  89. X               Else
  90. X                  Snake_Tail_Y := Snake_Tail_Y + 1;
  91. X     Blank,'0' : `7B Nothing `7D;
  92. X         end `7B CAse `7D;
  93. X      end;
  94. X      Len_Snake := Len_Snake - 1;
  95. X   end Else
  96. X      pos(Snake_Tail_X,Snake_Tail_Y,Screen`5BSnake_Tail_X,Snake_Tail_Y`5D.Sy
  97. Vm);
  98. Xend `7B remove_Tail`7D;
  99. X
  100. XBegin
  101. X   Swaped_head := False;
  102. X   Get_Move_For_Snake;
  103. X   If Snake_Got_Stuck Then begin
  104. X      Remove_tail;
  105. X      Get_Move_For_Snake;
  106. X      If Snake_Got_Stuck Then begin
  107. X         Remove_tail;
  108. X         Get_Move_For_Snake;
  109. X      end;
  110. X   end;
  111. X   If ( Not Snake_Got_Stuck ) and ( Not Swaped_head ) Then Begin
  112. X      Save_ch := Screen`5BSnake_Tail_X,Snake_Tail_Y`5D.Sym;
  113. X      If Len_Snake > 2 Then`20
  114. X         Screen`5BSnake_Tail_X,Snake_Tail_Y`5D.Sym := '%';
  115. X      Screen`5BSnake_Head_X,Snake_Head_Y`5D.Wall := Snake;
  116. X      Screen`5BSnake_Head_X,Snake_Head_Y`5D.Sym :=`20
  117. X               Correct_Sym(Snake_Head_X,Snake_Head_Y,Snake_Head_X+Snake_Move
  118. V_X,Snake_Head_Y+Snake_Move_Y);  `20
  119. X      If (( Snake_Head_X<>Snake_Tail_X ) or ( Snake_Head_Y<>Snake_Tail_Y ) )
  120. V and (Len_Snake > 2) Then`20
  121. X         Screen`5BSnake_Tail_X,Snake_Tail_Y`5D.Sym := Save_ch ;
  122. X      Pos(Snake_Head_X,Snake_Head_Y,Screen`5BSnake_Head_X,Snake_Head_Y`5D.Sy
  123. Vm);
  124. X      Len_snake := Len_Snake+1;
  125. X      Snake_Head_X := Snake_Head_X + Snake_Move_X;
  126. X      Snake_Head_Y := Snake_Head_Y + Snake_Move_Y;
  127. X      Pos(Snake_Head_X,Snake_Head_Y,Qix_Head);
  128. X      Remove_tail;
  129. X   end;
  130. Xend;
  131. X
  132. X        `20
  133. X
  134. X
  135. XProcedure Move_You;
  136. X
  137. XVar Count,X,Y,Tmp_X,Tmp_Y,LTmp_X,LTmp_Y: Integer;
  138. X   ch,save_ch : char;
  139. X    Inside_Box,Created_Box : Boolean;
  140. X
  141. XProcedure Cal_Inside;
  142. X
  143. XVar X,Y,Last_Y,Sudo_X,Sudo_Y,Lsudo_X,LSudo_Y,Max_X,Min_X,Max_Y,Min_Y: Intege
  144. Vr;
  145. X    Inside_Box,Written_something : Boolean;
  146. X
  147. XProcedure Max_Or_Min(X,Y:Integer);
  148. X
  149. XBegin
  150. XIf X > Max_X Then`20
  151. X      Max_X := X
  152. Xelse
  153. X   If X < Min_X Then`20
  154. X      Min_X := X;
  155. XIf Y > Max_Y Then`20
  156. X      Max_Y := Y
  157. Xelse
  158. X   If Y < Min_Y Then`20
  159. X      Min_Y := Y;
  160. Xend;
  161. X
  162. X
  163. XBegin
  164. X   Sudo_X := Snake_Head_X;
  165. X   Sudo_Y := Snake_Head_Y;
  166. X   While Not ( Screen`5BSudo_X,Sudo_Y`5D.Wall In `5BCreated,Inside`5D) Do`20
  167. X         Sudo_X := Sudo_X - 1;
  168. X   If Screen`5BSudo_X,Sudo_Y`5D.Wall =  Created Then Begin
  169. X      LSudo_X := Sudo_X;
  170. X      LSudo_Y := Sudo_Y;
  171. X      Case Screen`5BSudo_X,Sudo_Y`5D.Sym Of`20
  172. X          'm' , `20
  173. X          'v' ,
  174. X          'q' : Sudo_Y := Sudo_Y + 1;
  175. X          'j' : Sudo_X := Sudo_X - 1;
  176. X      End `7B CAse `7D;
  177. X      While Screen`5BSudo_X,Sudo_Y`5D.Wall = Created Do Begin
  178. X            Move_Clockwise(Sudo_X,Sudo_Y,LSudo_X,LSudo_Y);
  179. X      end;
  180. X   end Else begin
  181. X      LSudo_X := Sudo_X;
  182. X      LSudo_Y := Sudo_Y;
  183. X      Case Screen`5BSudo_X,Sudo_Y`5D.Sym Of`20
  184. X         'm' ,
  185. X         'v' ,
  186. X         'q' : Sudo_Y := Sudo_Y + 1;
  187. X         'j' : Sudo_X := Sudo_X - 1;
  188. X      End `7B CAse `7D;
  189. X   end;
  190. X   While Screen`5BSudo_X,Sudo_Y`5D.Wall <> Created Do Begin
  191. X         Move_Clockwise(Sudo_X,Sudo_Y,LSudo_X,LSudo_Y);
  192. X   end;
  193. X   Sleep(0,2500000);
  194. X
  195. X
  196. X   If ( Sudo_X = Start_Creat_X ) And ( Sudo_Y = Start_Creat_Y ) Then`20
  197. X      Dir_You := Clockwise
  198. X   Else
  199. X      Dir_You := AntiClockwise;
  200. X
  201. X   Move_Opp_Clockwise(Sudo_X,Sudo_Y,LSudo_X,LSudo_Y);
  202. X
  203. X   Min_X := 9999;
  204. X   Min_Y := 9999;
  205. X   Max_X := -9999;
  206. X   Max_Y := -9999;
  207. X   While Screen`5BSudo_X,Sudo_Y`5D.Wall <> Created Do Begin
  208. X         Screen`5BSudo_X,Sudo_Y`5D.Wall := Tmp;
  209. X         If Screen`5BSudo_X,Sudo_Y`5D.Sym = 'k' Then`20
  210. X            IF ( LSudo_X = Sudo_X + 1) Then`20
  211. X               Screen`5BSudo_X,Sudo_Y`5D.wall := TmpN
  212. X            else
  213. X          else
  214. X            If Screen`5BSudo_X,Sudo_Y`5D.Sym = 'j' Then
  215. X               If (LSudo_Y = Sudo_Y - 1) Then`20
  216. X                  Screen`5BSudo_X,Sudo_Y`5D.Wall := TmpN
  217. X`09`09else
  218. X            else
  219. X              If Screen`5BSudo_X,Sudo_Y`5D.Sym = 'u' Then`20
  220. X                  If (Lsudo_X = Sudo_X + 1 ) Then`20
  221. X                     Screen`5BSudo_X,Sudo_Y`5D.Wall := TmpN;
  222. X         Move_Clockwise(Sudo_X,Sudo_Y,LSudo_X,LSudo_Y);
  223. X         Max_Or_Min(Sudo_X,Sudo_Y);
  224. X   end;
  225. X   Sleep(0,2500000);
  226. X   While ( Screen`5BSudo_X,Sudo_Y`5D.Wall = Created ) Do Begin
  227. X         Screen`5BSudo_X,Sudo_Y`5D.Wall := TmpCreat;
  228. X         If Screen`5BSudo_X,Sudo_Y`5D.Sym = 'k' Then`20
  229. X            IF ( LSudo_X= Sudo_X + 1) Then`20
  230. X                Screen`5BSudo_X,Sudo_Y`5D.wall := TmpN2
  231. X            else
  232. X         else
  233. X            If Screen`5BSudo_X,Sudo_Y`5D.Sym = 'j' Then
  234. X               If (LSudo_Y = Sudo_Y - 1) Then`20
  235. X                  Screen`5BSudo_X,Sudo_Y`5D.Wall := TmpN2
  236. X`09`09else
  237. X            else
  238. X              If Screen`5BSudo_X,Sudo_Y`5D.Sym = 'u' Then`20
  239. X                  If (Lsudo_X = Sudo_X + 1 ) Then`20
  240. X                     Screen`5BSudo_X,Sudo_Y`5D.Wall := TmpN2;
  241. X         Max_Or_Min(Sudo_X,Sudo_Y);
  242. X         Move_Clockwise(Sudo_X,Sudo_Y,LSudo_X,LSudo_Y);
  243. X   end;
  244. X   Sleep(0,2500000);
  245. X   Break_Buff;
  246. X   Writeln(esc,'<',Esc,'`5B7m',esc,'`5B?2l',esc,'F',Esc,'H');
  247. X   For X := Min_X To Max_X Do Begin
  248. X      Inside_box := False;
  249. X      For Y := Min_Y To Max_Y Do begin
  250. X         If Not ( Screen`5BX,Y`5D.Wall IN   `5BInside,Outside,Snake,Other`5D
  251. V) Then Begin
  252. X            If Screen`5BX,Y`5D.Sym In `5B'x','t'`5D Then`20
  253. X               If Inside_Box Then Begin
  254. X                  Written_something := False;
  255. X                  Inside_box := False
  256. X               End else
  257. X                  Inside_Box := True
  258. X            else
  259. X               If Screen`5BX,y`5D.Sym in `5B'k','j','u'`5D Then Begin
  260. X                  If Not ( Screen`5BX,Y`5D.Wall In `5BTmpN,TmpN2`5D ) Then b
  261. Vegin
  262. X                     Written_Something := False;
  263. X                     Inside_Box := False
  264. X                  end else
  265. X                     Inside_Box := True;
  266. X               end else begin
  267. X                  If Written_Something Then begin
  268. X                     Written_Something := False;
  269. X                     Inside_Box := False
  270. X                  end Else
  271. X                     Inside_box := True;
  272. X               end;
  273. X         end Else Begin
  274. X             If INside_Box and ( Screen`5BX,y`5D.wall = Other ) Then Begin
  275. X               Amt_Filled_In := Amt_Filled_In + 1;
  276. X               If Not Written_Something Then  Begin
  277. X                  Pos(X,Y,Blank);
  278. X                  Written_Something := True;
  279. X               end Else
  280. X                  Write_Buff(Blank);
  281. X               Screen`5BX,Y`5D.Wall := Outside;
  282. X             end Else Begin
  283. X                  Inside_Box := False;
  284. X                  Written_something := False
  285. X             end;
  286. X         end;
  287. X      End;
  288. X   end;`20
  289. X   Break_Buff;
  290. X   Writeln(esc,'<',esc,'`5B0m',esc,'`5B?2l',Esc,'F',Esc,'H');
  291. X   While Screen`5BSudo_X,Sudo_Y`5D.Wall in `5BTmp,TmpN`5D Do Begin
  292. X         Screen`5BSudo_X,Sudo_Y`5D.Wall := Outside;
  293. X         Max_Or_Min(Sudo_X,Sudo_Y);
  294. X         Move_Clockwise(Sudo_X,Sudo_Y,LSudo_X,LSudo_Y);
  295. X   end;
  296. X   Amt_Filled_In := Amt_Filled_In - 2;
  297. X   While Screen`5BSudo_X,Sudo_Y`5D.Wall in `5BTmpCreat,Created,TmpN2`5D Do B
  298. Vegin
  299. X         Amt_Filled_In := Amt_Filled_In + 1;
  300. X         Screen`5BSudo_X,Sudo_Y`5D.Wall := INside;
  301. X         Max_Or_Min(Sudo_X,Sudo_Y);
  302. X         Move_Clockwise(Sudo_X,Sudo_Y,LSudo_X,LSudo_Y);
  303. X   end;
  304. X   If ( Not Marked_Clock_Greeb ) or`20
  305. X      ( Num_Marked_Clock_Greeb > 0 ) Then Begin   `7B > 0 If Marked When Ins
  306. Vide `7D
  307. X      Marked_Clock_Greeb := True;
  308. X      Marked_Clock_Greeb_X := Last_Clock_Greeb_X;
  309. X      Marked_Clock_Greeb_Y := Last_Clock_Greeb_Y;
  310. X      Num_Marked_Clock_Greeb := 0;
  311. X   end;
  312. X   If ( Not Marked_Anti_Greeb ) or`20
  313. X      ( Num_Marked_Anti_Greeb > 0 ) Then Begin
  314. X      Marked_Anti_Greeb := True;
  315. X      Marked_Anti_Greeb_X := Last_Anti_Greeb_X;
  316. X      Marked_Anti_Greeb_Y := Last_Anti_Greeb_Y;
  317. X      Num_Marked_Anti_Greeb := 0;
  318. X   end;
  319. Xend;
  320. X  `20
  321. X
  322. X           `20
  323. XFunction Valid_MOve:Boolean;
  324. X
  325. XFunction VAlid_MOve_Clockwise(X,Y,LX,LY,NX,NY:Integer):Boolean;
  326. X
  327. XBegin
  328. XMove_Clockwise(X,Y,LX,LY);
  329. XIf ( X = NX ) And ( Y = NY ) Then`20
  330. X   Valid_MOve_Clockwise := True
  331. XElse
  332. X   Valid_Move_Clockwise := False;
  333. Xend;
  334. X
  335. XFunction VAlid_MOve_Anti_Clockwise(X,Y,LX,LY,NX,NY:Integer):Boolean;
  336. X
  337. XBegin
  338. XMove_Anti_Clockwise(X,Y,LX,LY);
  339. XIf ( X = NX ) And ( Y = NY ) Then`20
  340. X   Valid_MOve_Anti_Clockwise := True
  341. XElse
  342. X   Valid_Move_Anti_Clockwise := False;
  343. Xend;
  344. X
  345. X
  346. XBegin
  347. XIf ( You_X = Last_You_X ) And ( You_Y = Last_You_Y ) Then Begin
  348. X    ValiD_Move := True;
  349. X    If Dir_You = Clockwise Then`20
  350. X       Dir_You := AntiClockwise
  351. X    Else
  352. X       Dir_You := Clockwise;
  353. Xend Else begin
  354. X   If Dir_You = Clockwise Then  begin
  355. X      If Valid_MOve_Clockwise(X,Y,Last_You_X,Last_You_Y,You_X,You_Y) Then`20
  356. X         Valid_Move := True
  357. X      Else
  358. X         Valid_Move := False;
  359. X   End Else BEgin
  360. X      If Valid_Move_Anti_Clockwise(X,Y,Last_You_X,Last_You_Y,You_X,You_Y) Th
  361. Ven`20
  362. X         Valid_Move := True
  363. X      Else
  364. X         Valid_Move := False;
  365. X   end;
  366. Xend;
  367. X
  368. X`7B   Case (Goto_X - x ) Of`20
  369. X      1 : If Screen`5BX,Y`5D.Sym in `5B'l','w','k','t','n','u','x'`5D Then`2
  370. V0
  371. X            Valid_Move := True
  372. X          Else
  373. X            Valid_Move := False;
  374. X      -1 : If Screen`5BX,y`5D.Sym in `5B't','n','u','m','v','j','x'`5D Then`
  375. V20
  376. X            Valid_Move := True
  377. X          Else
  378. X            Valid_Move := False;
  379. X       0 : Case (Goto_Y - Y ) Of`20
  380. X            1 : If Screen`5BX,y`5D.Sym In `5B'l','w','t','n','m','v','q'`5D
  381. V Then`20
  382. X               Valid_Move := True
  383. X             Else
  384. X               Valid_Move := False;
  385. X            -1: If Screen`5BX,y`5D.Sym In `5B'w','k','n','u','v','j','q'`5D
  386. V Then`20
  387. X               Valid_Move := True
  388. X             Else
  389. X               Valid_Move := False;
  390. X             0 : Valid_Move := False;
  391. X            end;
  392. X         end;`7D
  393. X   end;
  394. X
  395. XBegin
  396. XSave_ch := Screen`5BSnake_Tail_X,Snake_Tail_Y`5D.Sym;
  397. XIf Len_Snake > 2 Then`20
  398. X   Screen`5BSnake_Tail_X,Snake_Tail_Y`5D.Sym := '%';
  399. XX := You_X;
  400. XY := You_Y;
  401. XYou_X := You_X + Move_X;
  402. XYou_Y := You_Y + Move_Y;
  403. XCase Screen`5BYou_X ,You_Y`5D.Wall Of`20
  404. X   Other   : Begin
  405. X             If Can_Create_Wall Then Begin
  406. X                 If Not Creating_wall Then begin
  407. X                     Moves_since_stuck := 999;
  408. X                     Snake_After_X := 9999;
  409. X                     Snake_After_Y := 9999;
  410. X                     Start_Creat_X := X;
  411. X                     Start_Creat_Y := Y;
  412. X                     Last_Start_Creat_X := Last_You_X;
  413. X                     Last_Start_Creat_Y := Last_You_Y;
  414. X                     Dir_When_Start_Creat := Dir_You;
  415. X                 end;
  416. X         `09 Screen`5BX,y`5D.Sym  := Correct_Sym(X,Y,You_X,You_Y);
  417. X         `09 Screen`5BX,Y`5D.wall := Created;
  418. X              Creating_wall    := True;
  419. X              Last_You_X := X;
  420. X              Last_You_Y := Y;
  421. X             end else begin
  422. X                 You_X := X;
  423. X                 You_Y := Y;
  424. X             end;
  425. X             end;
  426. X   Snake   : Begin
  427. X             If ( Can_Create_wall ) Then Begin
  428. X                 Died := True;
  429. X                 If Not Creating_wall Then begin
  430. X                     Snake_After_X := 9999;
  431. X                     Snake_After_Y := 9999;
  432. X                     Start_Creat_X := X;
  433. X                     Start_Creat_Y := Y;
  434. X                     Last_Start_Creat_X := Last_You_X;
  435. +-+-+-+-+-+-+-+-  END  OF PART 3 +-+-+-+-+-+-+-+-
  436.  
  437.  
  438. __________
  439. Darin Reid
  440. Internet: Areid@Mary.Fordham.Edu
  441. Bitnet: Areid@Fordmulc
  442. Phone: (212) 749-8187
  443.